home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / blackfin / include / asm / dma.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  6.3 KB  |  206 lines

  1. /*
  2.  * File:         include/asm-blackfin/simple_bf533_dma.h
  3.  * Based on:     none - original work
  4.  * Author:       LG Soft India
  5.  *               Copyright (C) 2004-2005 Analog Devices Inc.
  6.  * Created:      Tue Sep 21 2004
  7.  * Description:  This file contains the major Data structures and constants
  8.  *          used for DMA Implementation in BF533
  9.  * Modified:
  10.  *
  11.  * Bugs:         Enter bugs at http://blackfin.uclinux.org/
  12.  *
  13.  * This program is free software; you can redistribute it and/or modify
  14.  * it under the terms of the GNU General Public License as published by
  15.  * the Free Software Foundation; either version 2, or (at your option)
  16.  * any later version.
  17.  *
  18.  * This program is distributed in the hope that it will be useful,
  19.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.  * GNU General Public License for more details.
  22.  *
  23.  * You should have received a copy of the GNU General Public License
  24.  * along with this program; see the file COPYING.
  25.  * If not, write to the Free Software Foundation,
  26.  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  27.  */
  28.  
  29. #ifndef _BLACKFIN_DMA_H_
  30. #define _BLACKFIN_DMA_H_
  31.  
  32. #include <asm/io.h>
  33. #include <linux/slab.h>
  34. #include <asm/irq.h>
  35. #include <asm/signal.h>
  36.  
  37. #include <linux/kernel.h>
  38. #include <mach/dma.h>
  39. #include <linux/mm.h>
  40. #include <linux/interrupt.h>
  41. #include <asm/blackfin.h>
  42.  
  43. #define MAX_DMA_ADDRESS PAGE_OFFSET
  44.  
  45. /*****************************************************************************
  46. *        Generic DMA  Declarations
  47. *
  48. ****************************************************************************/
  49. enum dma_chan_status {
  50.     DMA_CHANNEL_FREE,
  51.     DMA_CHANNEL_REQUESTED,
  52.     DMA_CHANNEL_ENABLED,
  53. };
  54.  
  55. /*-------------------------
  56.  * config reg bits value
  57.  *-------------------------*/
  58. #define DATA_SIZE_8         0
  59. #define DATA_SIZE_16         1
  60. #define DATA_SIZE_32         2
  61.  
  62. #define DMA_FLOW_STOP         0
  63. #define DMA_FLOW_AUTO         1
  64. #define DMA_FLOW_ARRAY         4
  65. #define DMA_FLOW_SMALL         6
  66. #define DMA_FLOW_LARGE         7
  67.  
  68. #define DIMENSION_LINEAR    0
  69. #define DIMENSION_2D           1
  70.  
  71. #define DIR_READ     0
  72. #define DIR_WRITE    1
  73.  
  74. #define INTR_DISABLE   0
  75. #define INTR_ON_BUF    2
  76. #define INTR_ON_ROW    3
  77.  
  78. #define DMA_NOSYNC_KEEP_DMA_BUF    0
  79. #define DMA_SYNC_RESTART    1
  80.  
  81. struct dmasg {
  82.     unsigned long next_desc_addr;
  83.     unsigned long start_addr;
  84.     unsigned short cfg;
  85.     unsigned short x_count;
  86.     short x_modify;
  87.     unsigned short y_count;
  88.     short y_modify;
  89. } __attribute__((packed));
  90.  
  91. struct dma_register {
  92.     unsigned long next_desc_ptr;    /* DMA Next Descriptor Pointer register */
  93.     unsigned long start_addr;    /* DMA Start address  register */
  94.  
  95.     unsigned short cfg;    /* DMA Configuration register */
  96.     unsigned short dummy1;    /* DMA Configuration register */
  97.  
  98.     unsigned long reserved;
  99.  
  100.     unsigned short x_count;    /* DMA x_count register */
  101.     unsigned short dummy2;
  102.  
  103.     short x_modify;    /* DMA x_modify register */
  104.     unsigned short dummy3;
  105.  
  106.     unsigned short y_count;    /* DMA y_count register */
  107.     unsigned short dummy4;
  108.  
  109.     short y_modify;    /* DMA y_modify register */
  110.     unsigned short dummy5;
  111.  
  112.     unsigned long curr_desc_ptr;    /* DMA Current Descriptor Pointer
  113.                        register */
  114.     unsigned long curr_addr_ptr;    /* DMA Current Address Pointer
  115.                            register */
  116.     unsigned short irq_status;    /* DMA irq status register */
  117.     unsigned short dummy6;
  118.  
  119.     unsigned short peripheral_map;    /* DMA peripheral map register */
  120.     unsigned short dummy7;
  121.  
  122.     unsigned short curr_x_count;    /* DMA Current x-count register */
  123.     unsigned short dummy8;
  124.  
  125.     unsigned long reserved2;
  126.  
  127.     unsigned short curr_y_count;    /* DMA Current y-count register */
  128.     unsigned short dummy9;
  129.  
  130.     unsigned long reserved3;
  131.  
  132. };
  133.  
  134. typedef irqreturn_t(*dma_interrupt_t) (int irq, void *dev_id);
  135.  
  136. struct dma_channel {
  137.     struct mutex dmalock;
  138.     char *device_id;
  139.     enum dma_chan_status chan_status;
  140.     struct dma_register *regs;
  141.     struct dmasg *sg;        /* large mode descriptor */
  142.     unsigned int ctrl_num;    /* controller number */
  143.     dma_interrupt_t irq_callback;
  144.     void *data;
  145.     unsigned int dma_enable_flag;
  146.     unsigned int loopback_flag;
  147. #ifdef CONFIG_PM
  148.     unsigned short saved_peripheral_map;
  149. #endif
  150. };
  151.  
  152. #ifdef CONFIG_PM
  153. int blackfin_dma_suspend(void);
  154. void blackfin_dma_resume(void);
  155. #endif
  156.  
  157. /*******************************************************************************
  158. *    DMA API's
  159. *******************************************************************************/
  160. /* functions to set register mode */
  161. void set_dma_start_addr(unsigned int channel, unsigned long addr);
  162. void set_dma_next_desc_addr(unsigned int channel, unsigned long addr);
  163. void set_dma_curr_desc_addr(unsigned int channel, unsigned long addr);
  164. void set_dma_x_count(unsigned int channel, unsigned short x_count);
  165. void set_dma_x_modify(unsigned int channel, short x_modify);
  166. void set_dma_y_count(unsigned int channel, unsigned short y_count);
  167. void set_dma_y_modify(unsigned int channel, short y_modify);
  168. void set_dma_config(unsigned int channel, unsigned short config);
  169. unsigned short set_bfin_dma_config(char direction, char flow_mode,
  170.                    char intr_mode, char dma_mode, char width,
  171.                    char syncmode);
  172. void set_dma_curr_addr(unsigned int channel, unsigned long addr);
  173.  
  174. /* get curr status for polling */
  175. unsigned short get_dma_curr_irqstat(unsigned int channel);
  176. unsigned short get_dma_curr_xcount(unsigned int channel);
  177. unsigned short get_dma_curr_ycount(unsigned int channel);
  178. unsigned long get_dma_next_desc_ptr(unsigned int channel);
  179. unsigned long get_dma_curr_desc_ptr(unsigned int channel);
  180. unsigned long get_dma_curr_addr(unsigned int channel);
  181.  
  182. /* set large DMA mode descriptor */
  183. void set_dma_sg(unsigned int channel, struct dmasg *sg, int nr_sg);
  184.  
  185. /* check if current channel is in use */
  186. int dma_channel_active(unsigned int channel);
  187.  
  188. /* common functions must be called in any mode */
  189. void free_dma(unsigned int channel);
  190. int dma_channel_active(unsigned int channel); /* check if a channel is in use */
  191. void disable_dma(unsigned int channel);
  192. void enable_dma(unsigned int channel);
  193. int request_dma(unsigned int channel, char *device_id);
  194. int set_dma_callback(unsigned int channel, dma_interrupt_t callback,
  195.              void *data);
  196. void dma_disable_irq(unsigned int channel);
  197. void dma_enable_irq(unsigned int channel);
  198. void clear_dma_irqstat(unsigned int channel);
  199. void *dma_memcpy(void *dest, const void *src, size_t count);
  200. void *safe_dma_memcpy(void *dest, const void *src, size_t count);
  201.  
  202. extern int channel2irq(unsigned int channel);
  203. extern struct dma_register *dma_io_base_addr[MAX_BLACKFIN_DMA_CHANNEL];
  204.  
  205. #endif
  206.